#include <klibc/ctype.h>
#include <mmu/mmu.h>
#include <mmu/physical.h>
#include <mmu/paging.h>
#include <driver/video.h>

/*
 * Restituisce la quantita' di ram
 */
int mmu_ram_size()
{
	return mmu_memory;
}


/*
 * Inizializza il gestore di memoria
 */
int mmu_init(unsigned long low, unsigned long up)
{
	// Calcola la memoria ram totale
	mmu_memory = low + up;
	if(mmu_memory <= 0) return 1;
	
	// Calcola il numero di pagine fisiche
	phy_page_number = phy_tot_pages();
	
	// Mostra le info riguardanti la gestione della memoria fisica
	//video_color_puts(VIDEO_GREEN_BLACK, "\t* ");
	//printf("%d bytes of total ram divided in ", mmu_memory/16);
	//printf("%d pages of %d kbytes\n", phy_page_number, PHY_PAGE_SIZE);

	// Inizializziamo la memoria fisica
	phy_init();
	
	// Inizializziamo la memoria paginata
	paging_init();
	
	// Test
	//mmu_test();

	return 0;
}
	
	
/*
 * Alcuni test per verificare il funzionamento della mmu
 */
void mmu_test()
{
	printf("Usate %d su %d\n", phy_page_number-phy_get_nfree_pages(), phy_page_number);

	void *a;
	void *b;
	void *c;
	void *d;
	a = phy_get_pages(5);
	printf("Usate %d su %d\n", phy_page_number-phy_get_nfree_pages(), phy_page_number);
	b = phy_get_pages(4);
	printf("Usate %d su %d\n", phy_page_number-phy_get_nfree_pages(), phy_page_number);
	c = phy_get_pages(3);
	printf("Usate %d su %d\n", phy_page_number-phy_get_nfree_pages(), phy_page_number);
	d = phy_get_pages(7);
	printf("Usate %d su %d\n", phy_page_number-phy_get_nfree_pages(), phy_page_number);
	phy_relase_pages(d);
	printf("Usate %d su %d\n", phy_page_number-phy_get_nfree_pages(), phy_page_number);
	phy_relase_pages(c);
	printf("Usate %d su %d\n", phy_page_number-phy_get_nfree_pages(), phy_page_number);
	phy_relase_pages(b);
	printf("Usate %d su %d\n", phy_page_number-phy_get_nfree_pages(), phy_page_number);
	phy_relase_pages(a);
	printf("Usate %d su %d\n", phy_page_number-phy_get_nfree_pages(), phy_page_number);
}



void *mmu_alloc(size_t size)
{
	return (void *) phy_get_pages(size);		
}


void mmu_free(void *adr)
{
	phy_relase_pages(adr);	
}

